package com.example.d6_homework.homework05;

import java.io.*;

public class Test {
    // 定义一个固定的键值,用于文件的加密和解密
    private static final int KEY = 0x55;

    public static void main(String[] args) {
        // 需求:编写一个加密解密程序
        String inputFilePath = "D:\\File\\a.txt";
        String encryptedFilePath = "D:\\File\\temp\\a_encrypted.txt";
        String decryptedFilePath = "D:\\File\\temp\\a_decrypted.txt";
        try {
            // 加密文件
            encryptFile(inputFilePath, encryptedFilePath);
            System.out.println("加密完成！！");

            // 解密文件
            decryptFile(encryptedFilePath, decryptedFilePath);
            System.out.println("解密完成！！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 加密文件方法
     * 读取输入文件的每个字节,使用XOR操作进行加密,并将结果写入输出文件
     *
     * @param inputFile  输入文件路径
     * @param outputFile 输出文件路径
     * @throws IOException 如果在文件读写过程中发生错误
     */
    public static void encryptFile(String inputFile, String outputFile) throws IOException {
        try (
                InputStream is = new FileInputStream(inputFile);
                OutputStream os = new FileOutputStream(outputFile)
        ) {
            int b;
            while ((b = is.read()) != -1) {
                os.write(encrypt(b));
            }
        }
    }

    /**
     * 解密文件方法
     * 读取输入文件的每个字节,使用XOR操作进行解密,并将结果写入输出文件
     *
     * @param inputFile  输入文件路径
     * @param outputFile 输出文件路径
     * @throws IOException 如果在文件读写过程中发生错误
     */
    public static void decryptFile(String inputFile, String outputFile) throws IOException {
        try (
                InputStream is = new FileInputStream(inputFile);
                OutputStream os = new FileOutputStream(outputFile)
        ) {
            int b;
            while ((b = is.read()) != -1) {
                os.write(decrypt(b));
                // 输出解密后的字符
                System.out.print((char) decrypt(b));
            }
        }
    }

    /**
     * 加密方法
     * 使用XOR操作对输入的字节进行加密
     *
     * @param i 输入字节
     * @return 加密后的字节
     */
    public static int encrypt(int i) {
        return i ^ KEY;
    }

    /**
     * 解密方法
     * 使用XOR操作对输入的字节进行解密因为XOR操作是可逆的,所以使用相同的密钥进行解密
     *
     * @param i 输入字节
     * @return 解密后的字节
     */
    public static int decrypt(int i) {
        return i ^ KEY;
    }
}
